package com.jxzn.locust.service;

import java.util.List;
import java.util.Optional;

import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;

import com.jxzn.locust.dao.AbstractRepository;
import com.jxzn.locust.model.AbstractModel;
import com.jxzn.locust.utils.UpdateUtils;

public interface AbstractService<T extends AbstractModel> {

    default T save(T t) {
        if (null != t.getId()) {
            Optional<T> optional = getRepository().findById(t.getId());
            if (optional.isPresent()) {
                T old = optional.get();
                UpdateUtils.copyNullProperties(t, old);
                t = old;
            }
        }
        return getRepository().save(t);
    }

    default List<T> saveAll(List<T> tList) {
        return getRepository().saveAll(tList);
    }

    default Optional<T> findById(int id) {
        return getRepository().findById(id);
    }

    default Optional<T> getOne(T t) {
        return getRepository().findOne(Example.of(t));
    }

    default List<T> findAll() {
        return getRepository().findAll();
    }

    default List<T> findAll(T t) {
        return getRepository().findAll(Example.of(t));
    }

    default Page<T> selectList(T t, Pageable pageable) {
        return getRepository().findAll(Example.of(t), pageable);
    }

    default int count(T t) {
        return (int) getRepository().count(Example.of(t));
    }

    default Page<T> findPage(Specification<T> spec, Pageable pageable) {
        return getRepository().findAll(spec, pageable);
    }

    default T update(T t) {
        return getRepository().save(t);
    }

    default void deleteById(int id) {
        getRepository().deleteById(id);
    }

    AbstractRepository<T> getRepository();
}
